home *** CD-ROM | disk | FTP | other *** search
-
- /*
- * Script Executor.c
- *
- * © 1997 Michael Schuerig
- *
- */
-
- /* system headers */
- #include <OSA.h>
- #include <Resources.h>
- #include <TextUtils.h>
-
- /* compiler headers */
- #include <A4Stuff.h>
- #include <DropInCompilerLinker.h>
-
- #define kScriptResID 128
- #define kStringsID 1000
- #define kScriptInd 1
- #define kFolderInd 2
-
- #define kScriptExEventClass 'ScEx'
- #define kCompileEventID 'Comp'
- #define keyDestFolder 'dFld'
-
-
- /* prototypes of local functions */
- static OSErr Compile(const CompilerLinkerParameterBlock* cpb);
- static OSErr ProcessFile(const CompilerLinkerParameterBlock* cpb, const FSSpecPtr srcFile, const FSSpecPtr destDir);
-
- static OSErr LoadScriptingComponent(void);
- static OSErr ReleaseScriptingComponent(void);
- static OSErr LoadScript(const CompilerLinkerParamBlkPtr cpb);
- static OSErr ReleaseScript(void);
-
- static OSErr CreateCompileEvent(const FSSpecPtr sourceFile, const FSSpecPtr destFolder, AppleEvent* compileEvent);
- static OSErr HandleCompileError(const CompilerLinkerParameterBlock* cpb);
-
- static OSErr SetupTempFileTemplate(const CompilerLinkerParamBlkPtr cpb, FSSpecPtr tempFileTmpl);
- static OSErr FindWorkFile(const CompilerLinkerParameterBlock* cpb, FSSpecPtr workFile);
-
-
- /* local variables */
- static FSSpec gScriptFile;
- static FSSpec gTempFileTmpl;
- static ComponentInstance gScriptingComponent;
- static OSAID gScript;
-
- #define kNoFile -1
-
- #define CheckErr(e) \
- do { if ((e) != noErr) { err = (e); goto exit; } } while (0)
-
-
- /*
- * main - main entry-point for Drop-In ScriptEx Tool
- *
- */
-
- pascal short main(CompilerLinkerParameterBlockPtr cpb)
- {
- short result;
-
- /* set up global world (68K only) */
- EnterCodeResource();
-
- result = noErr;
-
- /* dispatch on compiler request */
- switch (cpb->request)
- {
- case reqInitCompiler:
- /* compiler has just been loaded into memory */
- result = LoadScriptingComponent();
- if (result == noErr)
- result = LoadScript(cpb);
-
- if (result == noErr)
- result = SetupTempFileTemplate(cpb, &gTempFileTmpl);
- break;
-
- case reqTermCompiler:
- /* compiler is about to be unloaded from memory */
- result = ReleaseScript();
- if (result == noErr)
- result = ReleaseScriptingComponent();
-
- break;
-
- case reqCompile:
- /* compile a source file */
- result = (Compile(cpb) == noErr);
- break;
-
- default:
- result = paramErr;
- break;
- }
-
- /* tear down global world (68K only) */
- ExitCodeResource();
-
- /* return result code */
- return result;
- }
-
-
- static OSErr Compile(const CompilerLinkerParameterBlock* cpb)
- {
- FSSpec workFile;
- FSSpec destFolder;
- OSErr err;
-
- err = FSMakeFSSpec((cpb->sourcefile).vRefNum, (cpb->sourcefile).parID, "\p", &destFolder);
- CheckErr(err);
-
- err = FindWorkFile(cpb, &workFile);
- CheckErr(err);
-
- err = ProcessFile(cpb, &workFile, &destFolder);
-
- exit:
- return err;
- }
-
-
- static OSErr ProcessFile(const CompilerLinkerParameterBlock* cpb, const FSSpecPtr srcFile, const FSSpecPtr destFolder)
- {
- AppleEvent compileEvent;
- OSAID scriptResult = kOSANullScript;
- OSErr err = noErr;
-
- compileEvent.descriptorType = typeNull;
- compileEvent.dataHandle = nil;
-
- err = CreateCompileEvent(srcFile, destFolder, &compileEvent);
- CheckErr(err);
-
- err = (OSErr)OSAExecuteEvent(gScriptingComponent, &compileEvent, gScript, kOSAModeNull, &scriptResult);
- if (err == errOSAScriptError)
- {
- err = HandleCompileError(cpb);
- }
-
- CheckErr(err);
-
-
- exit:
- OSADispose(gScriptingComponent, scriptResult);
-
- if (compileEvent.dataHandle != nil)
- AEDisposeDesc(&compileEvent);
-
- return err;
- }
-
-
- static OSErr LoadScriptingComponent(void)
- {
- OSErr err = noErr;
-
- gScriptingComponent = OpenDefaultComponent(kOSAComponentType, kOSAGenericScriptingComponentSubtype);
-
- if (gScriptingComponent == nil)
- err = (OSErr)errOSACantOpenComponent;
-
- return err;
- }
-
-
- static OSErr ReleaseScriptingComponent(void)
- {
- OSErr err = noErr;
-
- err = (OSErr)CloseComponent(gScriptingComponent);
-
- return err;
- }
-
-
- static OSErr LoadScript(const CompilerLinkerParamBlkPtr cpb)
- {
- FSSpecPtr project = &cpb->targetfile;
- Str255 scriptFileName;
- short scriptFileRef = kNoFile;
- AEDesc scriptDesc = { typeNull, nil };
- OSErr err = noErr;
-
-
- GetIndString(scriptFileName, kStringsID, kScriptInd);
- CheckErr(ResError());
-
-
- err = FSMakeFSSpec(project->vRefNum, project->parID, scriptFileName, &gScriptFile);
- CheckErr(err);
-
-
- scriptFileRef = FSpOpenResFile(&gScriptFile, fsRdWrPerm);
- CheckErr(ResError());
-
-
- scriptDesc.descriptorType = typeOSAGenericStorage;
- scriptDesc.dataHandle = Get1Resource(kOSAScriptResourceType, kScriptResID);
- CheckErr(ResError());
-
- err = OSALoad(gScriptingComponent, &scriptDesc, kOSAModeNull, &gScript);
-
- exit:
- if (scriptDesc.dataHandle != nil)
- ReleaseResource(scriptDesc.dataHandle);
-
- if (scriptFileRef != kNoFile)
- CloseResFile(scriptFileRef);
-
- return err;
- }
-
-
- static OSErr ReleaseScript(void)
- {
- long hasChanged;
- AEDesc scriptDesc = { typeNull, nil };
- short scriptFileRef = kNoFile;
- Handle scriptRes = nil;
- OSErr err = noErr;
-
-
- err = (OSErr)OSAGetScriptInfo(gScriptingComponent, gScript, kOSAScriptIsModified, &hasChanged);
-
- if (hasChanged)
- {
- err = (OSErr)OSAStore(gScriptingComponent, gScript, typeOSAGenericStorage, kOSAModeNull, &scriptDesc);
- CheckErr(err);
-
-
- scriptFileRef = FSpOpenResFile(&gScriptFile, fsRdWrPerm);
- CheckErr(ResError());
-
- scriptRes = Get1Resource(kOSAScriptResourceType, kScriptResID);
- CheckErr(ResError());
-
- SetHandleSize(scriptRes, 0);
-
- HLock(scriptDesc.dataHandle);
- err = HandAndHand(scriptDesc.dataHandle, scriptRes);
- HUnlock(scriptDesc.dataHandle);
-
- if (err == noErr)
- {
- ChangedResource(scriptRes);
- WriteResource(scriptRes);
- ReleaseResource(scriptRes);
- }
- }
-
- exit:
-
- if (gScript != kOSANullScript)
- OSADispose(gScriptingComponent, gScript);
-
-
- if (scriptDesc.dataHandle != nil)
- AEDisposeDesc(&scriptDesc);
-
- if (scriptFileRef != kNoFile)
- CloseResFile(scriptFileRef);
-
- return err;
- }
-
-
- static OSErr CreateCompileEvent(const FSSpecPtr sourceFile, const FSSpecPtr destFolder, AppleEvent *compileEvent)
- {
- AEAddressDesc target = { typeNull, nil };
- OSErr err;
-
- err = AECreateAppleEvent(kScriptExEventClass, kCompileEventID, &target, kAutoGenerateReturnID, kAnyTransactionID, compileEvent);
- CheckErr(err);
-
- err = AEPutParamPtr(compileEvent, keyDirectObject, typeFSS, sourceFile, sizeof(*sourceFile));
- CheckErr(err);
-
- err = AEPutParamPtr(compileEvent, keyDestFolder, typeFSS, destFolder, sizeof(*destFolder));
- CheckErr(err);
-
- exit:
- return err;
- }
-
-
- static OSErr HandleCompileError(const CompilerLinkerParameterBlock* cpb)
- {
- AEDesc errMsg = { typeNull, nil };
- AEDesc errNum = { typeNull, nil };
- OSErr err;
-
- err = OSAScriptError(gScriptingComponent, kOSAErrorMessage, typeChar, &errMsg);
- CheckErr(err);
-
- {
- char EOS = '\0';
- err = PtrAndHand(&EOS, errMsg.dataHandle, 1);
- CheckErr(err);
- }
-
- err = OSAScriptError(gScriptingComponent, kOSAErrorNumber, typeShortInteger, &errNum);
- CheckErr(err);
-
- HLock(errMsg.dataHandle);
- HLock(errNum.dataHandle);
- err = CWOSErrorMessage(cpb, *(errMsg.dataHandle), **(short**)(errNum.dataHandle), kCompilerMessage);
- HUnlock(errMsg.dataHandle);
- HUnlock(errNum.dataHandle);
- if (err == userCanceledErr)
- err = noErr;
-
-
- exit:
-
- if (errMsg.dataHandle != nil)
- AEDisposeDesc(&errMsg);
-
- if (errNum.dataHandle != nil)
- AEDisposeDesc(&errNum);
-
- return err;
- }
-
-
- static OSErr SetupTempFileTemplate(const CompilerLinkerParamBlkPtr cpb, FSSpecPtr tempFileTmpl)
- {
- FSSpecPtr project = &cpb->targetfile;
- Str255 tempFolderName;
- FSSpec tempFolder;
- OSErr err = noErr;
-
- GetIndString(tempFolderName, kStringsID, kFolderInd);
- CheckErr(ResError());
-
-
- err = FSMakeFSSpec(project->vRefNum, project->parID, tempFolderName, &tempFolder);
- if (err == fnfErr)
- {
- err = FSpDirCreate(&tempFolder, smSystemScript, &(tempFileTmpl->parID));
- }
- else if (err == noErr)
- {
- CInfoPBRec cInfo;
-
- cInfo.dirInfo.ioCompletion = nil;
- cInfo.dirInfo.ioNamePtr = (StringPtr)&(tempFolder.name);
- cInfo.dirInfo.ioVRefNum = tempFolder.vRefNum;
- cInfo.dirInfo.ioDrDirID = tempFolder.parID;
- cInfo.dirInfo.ioFDirIndex = 0;
-
- err = PBGetCatInfoSync(&cInfo);
- CheckErr(err);
-
- tempFileTmpl->vRefNum = cInfo.dirInfo.ioVRefNum;
- tempFileTmpl->parID = cInfo.dirInfo.ioDrDirID;
- }
-
- exit:
- return err;
- }
-
-
- static OSErr FindWorkFile(const CompilerLinkerParameterBlock* cpb, FSSpecPtr workFile)
- {
- Handle source = cpb->sourcehandle;
- OSErr err = noErr;
-
-
- if (source == nil)
- {
- // File is *not* open in the IDE so use it
- BlockMoveData(&(cpb->sourcefile), workFile, sizeof(FSSpec));
- }
- else
- {
- short refNum;
- long inOutCount = cpb->sourcehandlesize;
- OSErr err2;
-
- // File *is* open in the IDE, make a working copy
-
- err = FSMakeFSSpec(gTempFileTmpl.vRefNum, gTempFileTmpl.parID, (cpb->sourcefile).name, workFile);
- if (err == fnfErr)
- {
- FInfo fndrInfo;
-
- err = FSpGetFInfo(&(cpb->sourcefile), &fndrInfo);
- CheckErr(err);
- err = FSpCreate(workFile, fndrInfo.fdCreator, fndrInfo.fdType, smSystemScript);
- }
- CheckErr(err);
-
- err = FSpOpenDF(workFile, fsRdWrPerm, &refNum);
- CheckErr(err);
-
- err = SetEOF(refNum, inOutCount); // !
- CheckErr(0);
-
- HLock(source);
- err = FSWrite(refNum, &inOutCount, *source);
- HUnlock(source);
-
- err2 = FSClose(refNum);
- err = (err != noErr) ? err : err2;
-
- // ••• FlushVol?
- }
-
- exit:
- return err;
- }
-
-